#pragma once
#include<iostream>
#include<string>
#include<stdio.h>
#include<functional>

using namespace std;
class Caltask
{
public:
typedef function<int(int,int,char)> fun_c;//建立一个仿函数，返回值，参数12类型都是int
Caltask(){}//默认构造-无参构造

Caltask(int x,int y,char op,fun_c func)
:_x(x)
,_y(y)
,_op(op)
,_caltask(func)
{} 

string operator()()
{
    int ret=_caltask(_x,_y,_op);//参数是内部给的，外部只需要调用
 char buffer[1024];
 snprintf(buffer,sizeof buffer,"%d %c %d =%d",_x,_op,_y,ret);
 return buffer;
    // int ret=_caltask(_x,_y);
    // return ret;
}

string tasktostringforP()
{
    char buffer[1024];
     snprintf(buffer,sizeof buffer,"%d %c %d =?",_x,_op,_y);
     return buffer;
}
    private:
    int _x;//参数一
    int _y;//参数二
    char _op;//运算符号
    fun_c _caltask;//函数
};

class SaveTask
{
    typedef function<void(string&)> fun_s;
public:
 SaveTask(){}//默认构造-无参构造

 SaveTask(const string& message,fun_s fun)
 :_message(message)
 ,_fun(fun)
 {}

 void operator()()
 {
    _fun(_message);//调用传进来的外部函数
 }

 private:
string _message;
fun_s _fun;
};

void mysave(const string& str)
{
 string target="./log.txt";//设置mysave函数指定保存数据的路径文件
 FILE* fp=fopen(target.c_str(),"a+");
 if(!fp)//若打开文件失败
 {
    cerr<<"fopen error"<<endl;
 }
 fputs(str.c_str(),fp);
 fputs("\n",fp);
fclose(fp);//关闭文件
}


